package info.rangier;

import info.stapel.*;

public class DoppelListe {

    protected StapelElement kopf, ende, aktuell;

    public DoppelListe() {
        kopf = ende = aktuell = null;
    }

    protected void zumAnfang() {
        aktuell = kopf;
    }

    protected void zumende() {
        aktuell = ende;
    }

    protected Object top() {
        return aktuell.object;
    }

    protected Object naechstesElement() {
        if (istLeer()) {
            return null;
        }
        if (aktuell.next != null) {
            aktuell = aktuell.next;
        }
        return aktuell.object;
    }

    protected Object Vorschau() {
        if (istLeer()) {
            return null;
        }
        if (aktuell.next != null) {
            return aktuell.next.object;
        } else {
            return aktuell.object;
        }
    }

    protected void vorneEinfuegen(Object o) {
        StapelElement l = new StapelElement(o, kopf);
        if (istLeer()) // leere Liste
        {
            kopf = ende = aktuell = l;
        } else {
            kopf = aktuell = l;
        }
    }

    protected void einfuegen(Object o) {
        if (istLeer()) //leere Liste
        {
            vorneEinfuegen(o);
            return;
        }
        StapelElement neu = new StapelElement(o, aktuell.next);
        aktuell.next = neu;
        if (aktuell == ende) //hinten an der Liste angefügt
        {
            ende = neu;
        }
    }

    
    
    protected Object aktuellesEntfernen() {
        if (istLeer()) //leere Liste
        {
            return null;
        }
        StapelElement entferne = aktuell, temp = kopf;
        if (entferne == kopf) //erstes Element entfernen
        {
            kopf = kopf.next;
            aktuell = kopf;
        } else {
            while (temp.next != entferne) {
                temp = temp.next;
            }
            //Vörgänger von entferne in temp
            temp.next = aktuell.next;
            aktuell = temp;
        }
        return entferne.object;
    }

    protected boolean istLeer() {
        return (kopf == null);
    }

    protected int gibLänge() {
        int Länge = 0;
        StapelElement temp = kopf;

        if (istLeer()) {
            return 0;
        }
        while (temp != null) {
            Länge++;
            temp = temp.next;
        }
        return Länge;
    }
    
    

    protected void goTo(int test_position) {
        this.zumAnfang();
        for(int i=0;i<test_position;i++){
            this.naechstesElement();
        }
    }
    
  
}
